package com.elitel.frame.business.dao.ext;

import com.elitel.frame.main.entity.vo.KeyValueModelVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author gyf
 * @Desciption 元数据操作mapper
 */
public interface DataBaseMetadataMapper {

    /**
     * @param
     * @Desciption 测试数据库连接Oracle
     * @author gyf
     */
    int testDataSourceOracle() throws Exception;

    /**
     * @param
     * @Desciption 测试数据库连接mysql或者sqlserver
     * @author gyf
     */
    int testDataSourceMysqlOrSqlServer() throws Exception;

    /**
     * @return Map<String, String>
     * @Desciption 查询数据库所有表信息Oracle
     * @author gyf
     */
    List<Map<String, String>> getAllTableOracle();

    /**
     * @param dbname 数据库名称
     * @return Map<String, String>
     * @Desciption 查询数据库所有表信息MySql
     * @author gyf
     */
    List<Map<String, String>> getAllTableMySql(String dbname);

    /**
     * @return Map<String, String>
     * @Desciption 查询数据库所有表信息 PostgreSQL数据库
     */
    List<Map<String, String>> getAllTablePostgreSQL(String dbname);

    /**
     * @return Map<String, String>
     * @Desciption 查询数据库所有表信息 KingbaseV8
     */
    List<Map<String, String>> getAllTableKingbaseV8();

    /**
     * @return Map<String, String>
     * @Desciption 查询数据库所有表信息 达梦数据库
     */
    List<Map<String, String>> getAllTableDM8();


    /**
     * @return Map<String, String>
     * @Desciption 查询数据库所有表信息SqlServer
     * @author gyf
     */
    List<Map<String, String>> getAllTableSqlServer();

    /**
     * @return String
     * @Desciption 通过表名称查询该表的主键Oracle
     * @author gyf show 修改获取多个主键 by date 2018/02/22
     */
    List<String> getPkNameOracle(String tableName);

    /**
     * @param tablename(表名称),dbname(数据库名称)
     * @return String
     * @Desciption 通过表名称查询该表的主键MySql
     * @author gyf show 修改获取多个主键 by date 2018/02/22
     */
    List<String> getPkNameMySql(@Param("tableName") String tableName, @Param("dbname") String dbname);

    /**
     * @return String
     * @Desciption 通过表名称查询该表的主键SqlServer
     * @author gyf show 修改获取多个主键 by date 2018/02/22
     */
    List<String> getPkNameSqlServer(String tableName);

    /**
     * @return String
     * @Desciption 通过表名称查询该表的主键 KingBaseV8
     */
    List<String> getPkNameKingbaseV8(String tableName);

    /**
     * @return String
     * @Desciption 通过表名称查询该表的主键 DM8
     */
    List<String> getPkNameDM8(@Param("tableName") String tableName, @Param("owner") String owner);

    /**
     * @param 表标识
     * @param user
     * @return List<Map < String, String>>
     * @Desciption 通过表名称查询字段信息Oracle
     * @author gyf
     */
    List<KeyValueModelVo> getFieldByTableOracle(
            @Param("tableName") String tableName, @Param("user") String user);

    /**
     * @param tableName(表名称),dbname(数据库名称)
     * @return List<Map < String, String>>
     * @Desciption 通过表名称查询字段信息MySql
     * @author gyf
     */
    List<KeyValueModelVo> getFieldByTableMySql(
            @Param("tableName") String tableName, @Param("dbname") String dbname);

    /**
     * @param tableName(表名称),dbname(数据库名称)
     * @return List<Map < String, String>>
     * @Desciption 通过表名称查询字段信息MySql
     * @author gyf
     */
    List<KeyValueModelVo> getFieldByTablePostgreSQL(
            @Param("tableName") String tableName, @Param("dbname") String dbname);

    /**
     * @param 表名称
     * @return List<KeyValueModelVo>
     * @Desciption 通过表名称查询字段信息SqlServer
     * @author gyf
     */
    List<KeyValueModelVo> getFieldByTableSqlServer(String tableName);

    /**
     * @param 表名称
     * @Desciption 通过表名称查询字段信息 KingBaseV8
     */
    List<KeyValueModelVo> getFieldByTableKingbaseV8(String tableName);

    /**
     * @param 表名称
     * @Desciption 通过表名称查询字段信息 DM8
     */
    List<KeyValueModelVo> getFieldByTableDM8(
            @Param("dbname") String dbname, @Param("tableName") String tableName);

    List<Map<String, Object>> getPostgresTableCount(@Param("schema")String schema,@Param("tableName") String tableName);

    List<Map<String, Object>> getSQLServerTableCount(@Param("tableName") String tableName);

    List<Map<String, Object>> getOracleTableCount(@Param("tableName") String tableName);

    List<Map<String, Object>> getMySQLTableCount(@Param("dbname") String dbname,@Param("tableName") String tableName);
}
